package com.sf.business.appointment.service.impl;

import com.sf.business.appointment.domain.BusCheckout;
import com.sf.business.appointment.domain.BusStatementItem;
import com.sf.business.appointment.mapper.BusCheckoutMapper;
import com.sf.business.appointment.mapper.BusStatementItemMapper;
import com.sf.business.appointment.qo.BusStatementItemQO;
import com.sf.business.appointment.service.IBusStatementItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.List;

/**
 * 结算单明细Service业务层处理
 *
 * @author lh
 * @date 2025-03-23
 */
@Service
public class BusStatementItemServiceImpl implements IBusStatementItemService {
    @Autowired
    private BusStatementItemMapper busStatementItemMapper;
    @Autowired
    private BusCheckoutMapper busCheckoutMapper;

    /**
     * 查询结算单明细
     *
     * @param id 结算单明细主键
     * @return 结算单明细
     */
    @Override
    public BusStatementItem selectBusStatementItemById(Long id) {
        return busStatementItemMapper.selectBusStatementItemById(id);
    }

    /**
     * 查询结算单明细列表
     *
     * @param busStatementItem 结算单明细
     * @return 结算单明细
     */
    @Override
    public List<BusStatementItem> selectBusStatementItemList(BusStatementItem busStatementItem) {
        return busStatementItemMapper.selectBusStatementItemList(busStatementItem);
    }

    /**
     * 新增结算单明细
     *
     * @param busStatementItem 结算单明细
     * @return 结果
     */
    @Override
    public int insertBusStatementItem(BusStatementItem busStatementItem) {
        return busStatementItemMapper.insertBusStatementItem(busStatementItem);
    }

    /**
     * 修改结算单明细
     *
     * @param busStatementItem 结算单明细
     * @return 结果
     */
    @Override
    public int updateBusStatementItem(BusStatementItem busStatementItem) {
        return busStatementItemMapper.updateBusStatementItem(busStatementItem);
    }

    /**
     * 批量删除结算单明细
     *
     * @param ids 需要删除的结算单明细主键
     * @return 结果
     */
    @Override
    public int deleteBusStatementItemByIds(Long[] ids) {
        return busStatementItemMapper.deleteBusStatementItemByIds(ids);
    }

    /**
     * 删除结算单明细信息
     *
     * @param id 结算单明细主键
     * @return 结果
     */
    @Override
    public int deleteBusStatementItemById(Long id) {
        return busStatementItemMapper.deleteBusStatementItemById(id);
    }

    @Override
    @Transactional
    public int saveBusStatementItem(BusStatementItemQO qo) {
        List<BusStatementItem> busStatementItems = qo.getBusStatementItems();
        if (busStatementItems.size() <= 0)
            throw new IllegalArgumentException("结算单明细不能为空");
        Long statementId = busStatementItems.get(0).getStatementId();

        BusCheckout busCheckout = busCheckoutMapper.selectBusCheckoutById(statementId);
        if (busCheckout == null)
            throw new IllegalArgumentException("结算单不存在");

        if (busCheckout.getStatus() == 1)
            throw new IllegalArgumentException("结算单已结算，不能修改");

        // 删除原 bus_statement_item 表中数据
        busStatementItemMapper.deleteBusStatementItemByStatementId(statementId);

        // 计算 总金额, 总数量, 并存储到 bus_statement 表中
        BigDecimal totalAmount = new BigDecimal(0);
        Long totalQuantity = 0L;

        // 计算 并 插入新 bus_statement_item 表中数据
        for (BusStatementItem busStatementItem : busStatementItems) {
            totalAmount = totalAmount.add(busStatementItem.getItemPrice().multiply(new BigDecimal(busStatementItem.getItemQuantity())));
            totalQuantity += busStatementItem.getItemQuantity();
            busStatementItemMapper.insertBusStatementItem(busStatementItem);
        }
        BigDecimal discountPrice = qo.getDiscountPrice();
        if (discountPrice.compareTo(totalAmount) > 0)
            throw new IllegalArgumentException("服务折扣价 不能大于 服务总价");
        busCheckout.setTotalAmount(totalAmount);
        busCheckout.setTotalQuantity(new BigDecimal(totalQuantity));
        busCheckout.setDiscountAmount(discountPrice);

        return busCheckoutMapper.updateBusCheckout(busCheckout);
    }
}
